#ifndef CONNECTIONLINE_H
#define CONNECTIONLINE_H

#include <QGraphicsPathItem>
#include <QGraphicsItem>
#include <QGraphicsScene>
#include <QPen>
#include <QPainter>
#include <QPainterPath>

class ConnectionLine : public QGraphicsPathItem {
public:
    // 连接方式
    ConnectionLine(QGraphicsItem *startItem, QGraphicsItem *endItem, QGraphicsScene *scene, int connectionType)
        : QGraphicsPathItem(), m_startItem(startItem), m_endItem(endItem), m_scene(scene), m_connectionType(connectionType) {
        setPen(QPen(Qt::black));  // 设置连接线的样式
        m_scene->addItem(this);   // 将连接线添加到场景
    }

    ~ConnectionLine() {
        // 在析构函数中不需要删除连接线，删除时已经从场景中移除
    }

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {
        updateLinePosition();  // 强制更新连接线位置

        // 使用QPainter绘制路径
        painter->setPen(pen());  // 使用自定义的笔
        painter->drawPath(path());
    }

    void updateLinePosition() {
        // 检查是否有一个或两个组件为空
        if (m_startItem == nullptr || m_endItem == nullptr) {
            qDebug() << "连接线的某个组件为空，删除连接线";
            m_scene->removeItem(this);
            delete this;
            return;
        }

        QRectF startRect = m_startItem->boundingRect();
        QRectF endRect = m_endItem->boundingRect();

        QPointF startPoint;
        QPointF endPoint;

        switch (m_connectionType) {
            case 1:
                //左左
                startPoint = m_startItem->mapToScene(startRect.bottomLeft());
                endPoint = m_endItem->mapToScene(endRect.bottomLeft());
                break;
            case 2:
                // 左中
                startPoint = m_startItem->mapToScene(endRect.bottomLeft());
                endPoint = m_endItem->mapToScene(QPointF(20, 30));
                break;
            case 3:
                // 左右
                startPoint = m_startItem->mapToScene(startRect.bottomLeft());
                endPoint = m_endItem->mapToScene(endRect.bottomRight());
                break;
            case 4:
                // 右左
                startPoint = m_startItem->mapToScene(startRect.bottomRight());
                endPoint = m_endItem->mapToScene(endRect.bottomLeft());
                break;
            case 5:
                // 右中
                startPoint = m_startItem->mapToScene(startRect.bottomRight());
                endPoint = m_endItem->mapToScene(QPointF(20, 30));
                break;
            case 6:
                // 右右
                startPoint = m_startItem->mapToScene(startRect.bottomRight());
                endPoint = m_endItem->mapToScene(endRect.bottomRight());
                break;
        }

        // 更新连接线的折线路径
        QPainterPath path;
        path.moveTo(startPoint);

        // 计算中间点
        QPointF middlePoint((startPoint.x() + endPoint.x()) / 2, (startPoint.y() + endPoint.y()) / 2);

        // 折线：先画到中间点再连接到终点
        path.lineTo(middlePoint);
        path.lineTo(endPoint);

        setPath(path);
    }

    int getconnectionType()
    {
        return m_connectionType;
    }
    // 公共getter方法
    QGraphicsItem* getStartItem() const { return m_startItem; }
    QGraphicsItem* getEndItem() const { return m_endItem; }

protected:
    QVariant itemChange(GraphicsItemChange change, const QVariant &value) override {
        // 当组件位置发生变化时更新连接线
        if (change == QGraphicsItem::ItemPositionChange || change == QGraphicsItem::ItemRotationChange) {
            updateLinePosition();  // 更新连接线的位置
        }

        return QGraphicsItem::itemChange(change, value);  // 调用父类的itemChange处理其他事情
    }

private:
    QGraphicsItem *m_startItem;  // 起始组件
    QGraphicsItem *m_endItem;    // 结束组件
    QGraphicsScene *m_scene;     // 场景指针
    int m_connectionType;        // 连接类型标志，1为第一种方式，2为第二种方式
};

#endif // CONNECTIONLINE_H
